﻿/***********************************************************************************\
| Copyright (c) 2011, Bashar Al-Rawi                                                |
| All rights reserved.                                                              |
|                                                                                   |
| Redistribution and use in source and binary forms, with or without                |
| modification, are permitted provided that the following conditions are met:       |
|    * Redistributions of source code must retain the above copyright               |
|      notice, this list of conditions and the following disclaimer.                |
|    * Redistributions in binary form must reproduce the above copyright            |
|      notice, this list of conditions and the following disclaimer in the          |
|      documentation and/or other materials provided with the distribution.         |
|    * Neither the name of the <organization> nor the                               |
|      names of its contributors may be used to endorse or promote products         |
|      derived from this software without specific prior written permission.        |
|                                                                                   |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND   |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     |
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE            |
| DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY                |
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES        |
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;      |
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND       |
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT        |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS     |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                      |
\***********************************************************************************/

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Serialization;
using System.Diagnostics;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Media.Imaging;
using System.Reflection;
using System.IO;

namespace Arabic.Controls
{
    enum ForegroundColors
    {
        White,
        Black
    }

    public enum KeyCode
    {
        AR,
        EN,
        CONTROL
    }

    public class KeyboardKey : System.ComponentModel.INotifyPropertyChanged
    {
        public string Text { get; set; }
        public KeyCode KeyCode { get; private set; }
        public int PlatformkeyCode { get; private set; }
        private double width;
        private double height;
        public double FontSize { get; private set; }
        private string imageName;
        private ForegroundColors foregroundColorString;
        private double _imageOffset;
        public double ImageOffset
        {
            get { return _imageOffset; }
            set { if (_imageOffset == value) return; _imageOffset = value; RaisePropertyChange("ImageOffset"); }
        }
        private double _textOffset;
        public double TextOffset 
        { 
            get { return _textOffset; }
            set { if (_textOffset == value) return; _textOffset = value; RaisePropertyChange("TextOffset"); } 
        }
        public bool HasImage
        {
            get { return !string.IsNullOrEmpty(imageName); }
        }
        public ImageSource ImageSource
        {
            get
            {
                BitmapSource img = null;
                if (this.HasImage)
                {
                    string source = string.Format("Arabic.Controls.Images.{0}_{1}.png", imageName, foregroundColorString.ToString().ToLowerInvariant());
                    img = new BitmapImage();
                    Assembly assembly = this.GetType().Assembly;
                    img.SetSource(assembly.GetManifestResourceStream(source));
                }
                return img;
            }

            private set
            {
                RaisePropertyChange("ImageSource");
            }
        }

        public bool IsDarkButton { get { return true; } }

        public void SwitchColors()
        {
            if(this.HasImage)
            {
                switch (foregroundColorString)
                {
                    case ForegroundColors.Black:
                        foregroundColorString = ForegroundColors.White;
                        ImageSource = null;
                        break;
                    case ForegroundColors.White:
                        foregroundColorString = ForegroundColors.Black;
                        ImageSource = null;
                        break;
                }
            }
        }

        public double Width
        {
            get {return width;}
            set { if (width == value) return;  width = value; RaisePropertyChange("Width"); }
        }

        public double Height
        {
            get { return height; }
            set { if (height == value) return; height = value; RaisePropertyChange("Height"); }
        }
        private double horizontalWidth;
        private double horizontalHeight;
        private double verticalWidth;
        private double verticalHeight;
        public KeyboardKey(string text, string keyCode, int platformKeyCode, double width, double height, double fontSize, string imageName)
        {
                this.Text = text;
                this.KeyCode = (KeyCode)Enum.Parse(typeof(KeyCode), keyCode, true);
                this.PlatformkeyCode = platformKeyCode;
                this.verticalWidth = width;
                this.horizontalWidth = width * 1.511;
                this.verticalHeight = height;
                this.horizontalHeight = height * 0.72;
                this.FontSize = fontSize;
                this.imageName = imageName;

                Update();
                if (ApplicationGlobals.IsDarkTheme)
                {
                    foregroundColorString = ForegroundColors.White;
                }
                else
                {
                    foregroundColorString = ForegroundColors.Black;
                }

        }

        public void Update()
        {
            if (ApplicationGlobals.IsLandscape)
            {
                this.Width = this.horizontalWidth;
                this.Height = this.horizontalHeight;
                this.ImageOffset = 2;
                this.TextOffset = 8;
            }
            else
            {
                this.Width = this.verticalWidth;
                this.Height = this.verticalHeight;
                this.ImageOffset = 12;
                this.TextOffset = 18;
            }
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChange(string propertyName)
        {
            System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(propertyName));
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }        
    }
}
